﻿using System.ComponentModel;
using Black.SurfaceToolkit.Tools;

namespace Samples.ContactTracking
{
    /// <summary>
    /// Représente des informations simples sur un contact.
    /// </summary>
    public class ContactInfo : INotifyPropertyChanged
    {
        #region Evénements

        /// <summary>
        /// Se produit lorsqu'une propriété est modifiée.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Variables d'instance

        private int m_iID;
        private float m_fOrientation;
        private float m_fX;
        private float m_fY;

        #endregion

        #region Accesseurs

        /// <summary>
        /// Obtient ou définit l'identifiant du contact.
        /// </summary>
        public int ID
        {
            get
            {
                return (this.m_iID);
            }
            set
            {
                if (this.ID != value)
                {
                    this.m_iID = value;
                    this.OnPropertyChanged("ID");
                }
            }
        }

        /// <summary>
        /// Obtient ou définit l'orientation du contact.
        /// </summary>
        public float Orientation
        {
            get
            {
                return (this.m_fOrientation);
            }
            set
            {
                if (this.Orientation != value)
                {
                    this.m_fOrientation = value;
                    this.OnPropertyChanged("Orientation");
                }
            }
        }

        /// <summary>
        /// Obtient ou définit la coordonnée en X du contact.
        /// </summary>
        public float X
        {
            get
            {
                return (this.m_fX);
            }
            set
            {
                if (this.X != value)
                {
                    this.m_fX = value;
                    this.OnPropertyChanged("X");
                }
            }
        }

        /// <summary>
        /// Obtient ou définit la coordonnée en Y du contact.
        /// </summary>
        public float Y
        {
            get
            {
                return (this.m_fY);
            }
            set
            {
                if (this.Y != value)
                {
                    this.m_fY = value;
                    this.OnPropertyChanged("Y");
                }
            }
        }

        #endregion

        #region Constructeurs

        /// <summary>
        /// Initialise une nouvelle instance de <see cref="T:Samples.ContactTracking.ContactInfo" />.
        /// </summary>
        /// <param name="p_oContact">Information sur le contact source.</param>
        public ContactInfo(CoreContact p_oContact)
            : base()
        {
            this.Update(p_oContact);
        }

        #endregion

        #region Fonctions privées

        /// <summary>
        /// Déclenche l'événement <see cref="E:Samples.ContactTracking.ContactInfo.PropertyChanged" />.
        /// </summary>
        /// <param name="p_oPropertyName">Nom de la propriété ayant été modifiée.</param>
        private void OnPropertyChanged(string p_oPropertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(p_oPropertyName));
        }

        #endregion

        #region Fonctions publiques

        /// <summary>
        /// Met à jour les informations du contact.
        /// </summary>
        /// <param name="p_oContact">Information sur le contact source.</param>
        public void Update(CoreContact p_oContact)
        {
            this.ID = p_oContact.Contact.Id;
            this.Orientation = p_oContact.Contact.Orientation;
            this.X = p_oContact.Contact.X;
            this.Y = p_oContact.Contact.Y;
        }

        #endregion
    }
}
